package Gestores.DtoObjects;

import Gestores.DaoInterfaces.UsuarioDAO;
import Gestores.DataBaseLink;
import Gestores.Entidades.EntidadPermiso;
import Gestores.Entidades.EntidadUsuario;
import Gestores.NucleoBaseDatos;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class UsuarioDTO implements UsuarioDAO {

    private DataBaseLink gestor;
    
        public UsuarioDTO() {
        this.gestor = NucleoBaseDatos.getInstance();
    }
    
    public ArrayList<EntidadPermiso> devolverPermisosLogin(String login) throws Exception{
        ResultSet resultado = gestor.executeSql(
                        "Call RecuperarPermisosLogin('" + login +  "');");
        return this.devolverPermisos(resultado);
    }
    
    public ArrayList<EntidadPermiso> devolverPermisosId(String Id) throws Exception{
        ResultSet resultado = gestor.executeSql(
                        "Call RecuperarPermisosId(" + Id +  ");");
        return this.devolverPermisos(resultado);
    }
    
    
    public boolean verificarPassword(String login, String password) throws Exception{
    ResultSet resultado = gestor.executeSql(
                "Select VerificarPassword('" + login + "','"+ password + "');");
    resultado.next();
    return resultado.getBoolean(1);
     }
    
    public void actualizarUsuarioPassword(String id, String pass) throws Exception{
        ResultSet resultado = gestor.executeSql(
                "Call actualizarUsuarioPassword(" + id + ",'" + pass + "');"
                );
    }
    
    public void insertarUsuario(Object o) throws Exception{
        EntidadUsuario u = (EntidadUsuario) o;
        System.out.println("Call InsertarUsuario(" + u.cadenaParaInsercion());
        gestor.executeSql("Call InsertarUsuario(" + u.cadenaParaInsercion());
        
    }
    
        
    
    
    public void asignarGrupoUsuario(String idUsuario, String idGrupo) throws Exception{
        ResultSet resultado = gestor.executeSql(
                "Call AsignarGrupoUsuario(" + idUsuario + "," + idGrupo + ");");
    }
    
    public ArrayList<Object> buscarUsuarioNombre(String nombre) throws Exception{
        ResultSet resultado = gestor.executeSql(
                "Call BuscarUsuarioNombre('" + nombre + "');" );
        return this.devolverListaUsuario(resultado);
    }
    
    public ArrayList<Object> buscarUsuarioApellido(String apellido) throws Exception{
        ResultSet resultado = gestor.executeSql(
                "Call BuscarUsuarioApellido('" + apellido + "');");
        return this.devolverListaUsuario(resultado);
    }
    
    public void eliminarUsuario(String id) throws Exception{
        gestor.executeSql("Call EliminarUsuario(" + id + ");");
    }
    
    public ArrayList<Object> listarUsuarios() throws Exception{
        ResultSet resultado = gestor.executeSql(
                "Call ListarUsuarios()");
        return this.devolverListaUsuario(resultado);
    }
    
    public Object devolverUsuario(String login) throws Exception{
        ResultSet resultado = gestor.executeSql("Call devolverUsuario('" + login + "');");
        return this.cargarUsuario(resultado);
    }
    
    @Override
    public ArrayList<Object> buscarPorId(String id) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public ArrayList<Object> buscarPorNombre(String nombre) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void insertar(Object objeto) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void actualizar(Object primaryKey, Object objeto) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void eliminacionLogica(Object objeto) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void eliminacionFisica(Object objeto) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public ArrayList<Object> listarTabla() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    
    
    

    private ArrayList<EntidadPermiso> devolverPermisos(ResultSet resultado) throws SQLException {
        ArrayList<EntidadPermiso> lista = new ArrayList<EntidadPermiso>();
        while (resultado.next()) {
            EntidadPermiso ePermiso = new EntidadPermiso(
                    resultado.getInt(1),    
                    resultado.getInt(2),
                    resultado.getBoolean(3),
                    resultado.getBoolean(4),
                    resultado.getBoolean(5),
                    resultado.getBoolean(6)
                    );
            lista.add(ePermiso);
        }
        // APOR HACER
        return lista;
    }
    
    private ArrayList<Object> devolverListaUsuario(ResultSet resultado) throws SQLException {
        ArrayList<Object> lista = new ArrayList<Object>();
        while(resultado.next()){
            EntidadUsuario eUsuario = new EntidadUsuario(
                    resultado.getInt(1),
                    resultado.getString(2),
                    resultado.getString(3),
                    resultado.getString(4));
            lista.add(eUsuario);
        }
        return lista;
    }
    
    private Object cargarUsuario(ResultSet resultado) throws SQLException{
        resultado.next();
        EntidadUsuario eUsuario = new EntidadUsuario(
                    resultado.getInt(1),
                    resultado.getString(2),
                    resultado.getString(3),
                    resultado.getString(4));
        return eUsuario;
        
        
    }
}
